# @Time : 2024-10-23 13:54
# @Author : Fioman 
# @Phone : 13149920693
from collections import namedtuple

"""
命名元组(namedtuple) 创建元组对象,元组的元素不仅仅可以通过索引来访问,还可以通过名称来访问.
1) 可读性好
2) 不可变性
3) 比字典占用更少的内存
"""
# region 1. 命名元组的简单使用
# 创建一个命名元组类型
Person = namedtuple('Person', ["name", "age", "gender"])
# 创建命名元组实例
p = Person("Fioman", gender="男", age=18)
print(p)
print(p.name, p.age, p.gender)  # 通过属性名称访问
print(p[0], p[1], p[2])  # 通过索引访问


# endregion

# region 2. 作为函数发的返回值,命名元组可以提供一个清晰,结构化的返回
def get_stu_info():
    Student = namedtuple('Student', ['name', 'age', 'gender'])
    return Student("Fioman", 18, "男")


print(get_stu_info().name)
# endregion

# region 3. 命名元组作为类的轻量级代替
Config = namedtuple('Config', ['host', 'port', 'debug'])
config = Config("localhost", 8080, True)
if config.debug:
    print(f"host = {config.host}, port = {config.port}")
# endregion

# region 4. 命名元组可以转换为字典 _asdict()
Person = namedtuple('Person', ["name", "age", "gender"])
p = Person("Fioman", 18, "男")
pDict = p._asdict()
print(p, type(p), type(Person))
print(pDict, type(pDict))
# endregion

# region 5. 获取命名元组的所有的属性 _fields
print(p, p._fields)
print(pDict, pDict.keys())
# endregion
